﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EpsiRisk.DonneesPlateau;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework;

namespace EpsiRisk.MoteurJeu
{
    public static class ClassDetectionClicTerritoire
    {
        static Texture2D t2dMap, t2dColorKey;

        // Constantes pour récupérer les couleurs en fonction du code décimal retourné

        // Océan
        const uint color_ocean = 0;

        // Europe
        const uint c_eur_occ = 4278223103; // Europe Occidentale
        const uint c_eur_est = 4278206592; // Europe de l'Est
        const uint c_scandinavie = 4278214911; // Scandinavie
        const uint c_eur_nord = 4278190335; // Europe du Nord
        const uint c_grande_bretagne = 4278198400; // Grande Bretagne
        const uint c_islande = 4278198527; // Islande
        const uint c_ukraine = 4278190208; // Ukraine

        // Asie
        const uint c_oural = 4278206464; // Oural
        const uint c_siberie = 4278222848; // Sibérie
        const uint c_yakoutie = 4278214784; // Yakoutie
        const uint c_coree = 4278222912; // Corée
        const uint c_mongolie = 4278204928; // Mongolie
        const uint c_chine = 4278218816; // Chine
        const uint c_siam = 4284546944; // Siam
        const uint c_inde = 4278222976; // Inde
        const uint c_moyen_orient = 4278210560; // Moyen-Orient
        const uint c_tchita = 4286643968; // Tchita
        const uint c_japon = 4286615296; // Japon
        const uint c_afghanistan = 4279825024; // Afghanistan

        // Afrique
        const uint c_madagascar = 4289627904; // Madagascar
        const uint c_afr_sud = 4286595072; // Afrique du Sud
        const uint c_congo = 4289615616; // Congo
        const uint c_afr_orientale = 4294934528; // Afrique orientale
        const uint c_afr_nord = 4294938971; // Afrique du Nord
        const uint c_egypte = 4286586880; // Egypte

        // Amérique du Nord
        const uint c_alaska = 4290150400; // Alaska
        const uint c_terr_nord_ouest = 4283453479; // Territoire du Nord-Ouest
        const uint c_groenland = 4294967040; // Groenland
        const uint c_alberta = 4294958336; // Alberta
        const uint c_ontario = 4287927369; // Ontario
        const uint c_quebec = 4294967091; // Québec
        const uint c_etat_ouest = 4283453541; // Etat de l'Ouest
        const uint c_etat_est = 4286611456; // Etat de l'Est
        const uint c_am_centrale = 4294967168; // Amérique centrale

        // Amérique du Sud
        const uint c_venezuela = 4294934656; // Vénézuela
        const uint c_bresil = 4286595136; // Brésil
        const uint c_perou = 4286578688; // Pérou
        const uint c_argentine = 4294901760; // Argentine

        // Océanie
        const uint c_indonesie = 4286578943; // Indonésie
        const uint c_nouv_guinee = 4291166463; // Nouvelle-Guinée
        const uint c_austr_occidentale = 4286578752; // Australie occidentale
        const uint c_austr_orientale = 4282384448; // Australie orientale

        public static string countryOfInt(uint uCountry)
        {
            string sCountry;
            switch (uCountry)
            {
                // Océan
                case color_ocean: sCountry = "Océan"; break;

                // Europe
                case c_eur_occ: sCountry = "Europe Occidentale"; break;
                case c_eur_est: sCountry = "Europe de l'Est"; break;
                case c_scandinavie: sCountry = "Scandinavie"; break;
                case c_eur_nord: sCountry = "Europe du Nord"; break;
                case c_grande_bretagne: sCountry = "Grande Bretagne"; break;
                case c_islande: sCountry = "Islande"; break;
                case c_ukraine: sCountry = "Ukraine"; break;

                // Asie
                case c_oural: sCountry = "Oural"; break;
                case c_siberie: sCountry = "Sibérie"; break;
                case c_yakoutie: sCountry = "Yakoutie"; break;
                case c_coree: sCountry = "Corée"; break;
                case c_mongolie: sCountry = "Mongolie"; break;
                case c_chine: sCountry = "Chine"; break;
                case c_siam: sCountry = "Siam"; break;
                case c_inde: sCountry = "Inde"; break;
                case c_moyen_orient: sCountry = "Moyen-Orient"; break;
                case c_tchita: sCountry = "Tchita"; break;
                case c_japon: sCountry = "Japon"; break;
                case c_afghanistan: sCountry = "Afghanistan"; break;

                // Afrique
                case c_madagascar: sCountry = "Madagascar"; break;
                case c_afr_sud: sCountry = "Afrique du Sud"; break;
                case c_congo: sCountry = "Congo"; break;
                case c_afr_orientale: sCountry = "Afrique Orientale"; break;
                case c_afr_nord: sCountry = "Afrique du Nord"; break;
                case c_egypte: sCountry = "Egypte"; break;

                // Amérique du Nord
                case c_alaska: sCountry = "Alaska"; break;
                case c_terr_nord_ouest: sCountry = "Territoire du Nord-Ouest"; break;
                case c_groenland: sCountry = "Groenland"; break;
                case c_alberta: sCountry = "Alberta"; break;
                case c_ontario: sCountry = "Ontario"; break;
                case c_quebec: sCountry = "Québec"; break;
                case c_etat_ouest: sCountry = "Etat de l'Ouest"; break;
                case c_etat_est: sCountry = "Etat de l'Est"; break;
                case c_am_centrale: sCountry = "Amérique centrale"; break;

                // Amérique du Sud
                case c_venezuela: sCountry = "Vénézuela"; break;
                case c_bresil: sCountry = "Brésil"; break;
                case c_perou: sCountry = "Pérou"; break;
                case c_argentine: sCountry = "Argentine"; break;

                // Océanie
                case c_indonesie: sCountry = "Indonésie"; break;
                case c_nouv_guinee: sCountry = "Nouvelle-Guinée"; break;
                case c_austr_occidentale: sCountry = "Australie occidentale"; break;
                case c_austr_orientale: sCountry = "Australie orientale"; break;
                default: sCountry = "ERROR"; break;
            }
            return sCountry;
        }


        private static uint intOfStringCountry(string sCountry)
        {
            //TODO
            switch (sCountry)
            {
                case "Europe Occidentale": return c_eur_occ;
                default: return c_etat_ouest;
            }
        }

        public static ClassSousTerritoire TerritoireEnXY(int x, int y)
        {
            ClassSousTerritoire res = new ClassSousTerritoire();
            // ClassDonneesGlobales.plateauCourant. ###

            uint uCountry = color_ocean;
            string sCountry = "";
            uint[] myUint = new uint[1];
            if (x >= 0 && x < t2dColorKey.Width && y >= 0 && y < t2dColorKey.Height)
            {
                t2dColorKey.GetData<uint>(0, new Rectangle(x, y, 1, 1), myUint, 0, 1);
                uCountry = myUint[0];
            }

            sCountry = countryOfInt(uCountry);
            //Console.WriteLine("Clic sur le " + sCountry);
            return ClassDonneesGlobales.plateauCourant.rechercheSousTerritoireParNom(sCountry);
            //throw new NotImplementedException();
            //Cas ou le point serait hors des territoires ...
            //throw new NotATerritoryException();


        }

        public static void initialiser(ContentManager content)
        {
            t2dMap = content.Load<Texture2D>("Plateaux/detectionMap/map_display");
            t2dColorKey = content.Load<Texture2D>("Plateaux/detectionMap/map");
        }

        public static Texture2D mapRecoloree(ClassPlateau p)
        {
            uint[] myUint = new uint[1];
            Texture2D newMap = t2dMap;
            for (int x = 0; x < t2dMap.Width; x++)
            {
                for (int y = 0; y < t2dMap.Height; y++)
                {
                    t2dMap.GetData<uint>(0, new Rectangle(x, y, 1, 1), myUint, 0, 1);
                    string stNom = countryOfInt(myUint[0]);
                    if (stNom != "Océan" && stNom != "ERROR")
                    {
                        ClassSousTerritoire sttmp = (ClassDonneesGlobales.plateauCourant.rechercheSousTerritoireParNom(stNom));
                        if (sttmp != null)
                        {
                            Color newColor = sttmp.Proprietaire.cCouleur;
                            byte[] rgba = new byte[] { newColor.R, newColor.G, newColor.B, newColor.A };// newColor.R;newColor.R;newColor.R;newColor.R };
                            uint[] newUint = new uint[1];
                            newUint[0] = BitConverter.ToUInt32(rgba, 0);
                            newMap.SetData<uint>(0, new Rectangle(x, y, 1, 1), newUint, 0, 1, SetDataOptions.None);
                        }
                    }
                }
            }

            return t2dMap;
        }

        public static Texture2D calquePays(ClassSousTerritoire st)
        {
            Texture2D calque = t2dMap;
            uint uCountry = intOfStringCountry(st.Nom);
            uint[] myUint = new uint[1];
            for (int x = 0; x < t2dMap.Width; x++)
            {
                for (int y = 0; y < t2dMap.Height; y++)
                {
                    t2dMap.GetData<uint>(0, new Rectangle(x, y, 1, 1), myUint, 0, 1);
                    if (myUint[0] == uCountry)
                    {
                        myUint[0] = 4291166463;//TODO : modifier  la couleur en  un gris transparent ou autre...
                    }
                    else
                    {
                        myUint[0] = 0000000000;
                    }
                    calque.SetData<uint>(0, new Rectangle(x, y, 1, 1), myUint, 0, 1, SetDataOptions.None);
                }
            }
            return calque;
        }

    }



    public class NotATerritoryException : Exception
    {
    }
}
